package com.ly.emp.util;

import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * 一线班组数据处理工具
 *
 * @author luoyun
 * @Date 2023/5/19 15:00
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class TeamUtils {

    /**
     * 对象 -> 字符串
     *
     * @param o
     * @return
     */
    public static String getJsonStr(Object o) {
        if (ObjUtil.isNotEmpty(o)) {
            return JSONUtil.toJsonStr(o);
        }
        return null;
    }

    /**
     * 字符串 -> 对象
     *
     * @param str
     * @param t
     * @param <T>
     * @return
     */
    public static <T> T getJsonObject(String str, Class<T> t) {
        if (StrUtil.isBlank(str)) {
            return null;
        }
        JSONObject jsonObject = JSONUtil.parseObj(str);
        T obj = JSONUtil.toBean(jsonObject, t);
        return obj;
    }

    /**
     * 获取对应的时间列表
     */
    public static List<String> getPeriodCodeList(String periodCode) {
        if (StrUtil.isBlank(periodCode)) {
            return new ArrayList<>();
        }
        return periodCode.length() == 4 ? getJiByYearStr(periodCode) : getMonthByJiStr(periodCode);
    }

    /**
     * 通过季度得到对应的月份：2023Q2 -> 202304 202305 202306
     *
     * @return
     */
    public static List<String> getMonthByJiStr(String jiStr) {
        String year = jiStr.substring(0, 4);
        jiStr = jiStr.substring(4, 6);
        List<String> res = new ArrayList<>();
        if ("Q1".equals(jiStr)) {
            res.add(year + "01");
            res.add(year + "02");
            res.add(year + "03");
        } else if ("Q2".equals(jiStr)) {
            res.add(year + "04");
            res.add(year + "05");
            res.add(year + "06");
        } else if ("Q3".equals(jiStr)) {
            res.add(year + "07");
            res.add(year + "08");
            res.add(year + "09");
        } else if ("Q4".equals(jiStr)) {
            res.add(year + "10");
            res.add(year + "11");
            res.add(year + "12");
        }
        return res;
    }

    /**
     * excel 导出
     *
     * @param jiStr
     * @return
     */
    public static List<String> getMonthExcelHeaderByJiStr(String jiStr) {
        jiStr = jiStr.substring(4, 6);
        List<String> res = new ArrayList<>();
        if ("Q1".equals(jiStr)) {
            res.add("1月考核得分");
            res.add("2月考核得分");
            res.add("3月考核得分");
        } else if ("Q2".equals(jiStr)) {
            res.add("4月考核得分");
            res.add("5月考核得分");
            res.add("6月考核得分");
        } else if ("Q3".equals(jiStr)) {
            res.add("7月考核得分");
            res.add("8月考核得分");
            res.add("9月考核得分");
        } else if ("Q4".equals(jiStr)) {
            res.add("10月考核得分");
            res.add("11月考核得分");
            res.add("12月考核得分");
        }
        return res;
    }

    /**
     * 通过年度得到对应的季度：2023 -> 2023Q1 2023Q2 2023Q3
     *
     * @return
     */
    public static List<String> getJiExcelHeaderByYearStr(String year) {
        List<String> res = new ArrayList<>();
        res.add("1季度考核得分");
        res.add("2季度考核得分");
        res.add("3季度考核得分");
        res.add("4季度考核得分");
        return res;
    }

    public static String getNameByPeriodCode(String jiStr) {
        String res = "";
        String year = jiStr.substring(0, 4);
        jiStr = jiStr.substring(4, 6);
        if ("Q1".equals(jiStr)) {
            res = "2023年1季度";
        } else if ("Q2".equals(jiStr)) {
            res = "2023年2季度";
        } else if ("Q3".equals(jiStr)) {
            res = "2023年3季度";
        } else if ("Q4".equals(jiStr)) {
            res = "2023年4季度";
        }
        return res;
    }

    /**
     * 通过年度得到对应的季度：2023 -> 2023Q1 2023Q2 2023Q3
     *
     * @return
     */
    public static List<String> getJiByYearStr(String year) {
        List<String> res = new ArrayList<>();
        res.add(year + "Q1");
        res.add(year + "Q2");
        res.add(year + "Q3");
        res.add(year + "Q4");
        return res;
    }

    /**
     * 字符串数字 -> BigDecimal    0 -> 0
     *
     * @param num
     * @return
     */
    public static BigDecimal getBigDecimal(String num) {
        if (StrUtil.isBlank(num) || "null".equals(num)) {
            return BigDecimal.ZERO;
        }
        return new BigDecimal(num);
    }

    /**
     * 字符串数字 -> BigDecimal 0 -> 100
     *
     * @param num
     * @return
     */
    public static BigDecimal getBigDecimalFull(String num) {
        if (StrUtil.isBlank(num) || "null".equals(num)) {
            return new BigDecimal("100");
        }
        return new BigDecimal(num);
    }

    /**
     * 格式化字符串
     *
     * @param num
     * @return
     */
    public static String getStrByObject(Object num) {
        if (ObjUtil.isNull(num) || "null".equals(num)) {
            return null;
        }
        return String.valueOf(num);
    }

    /**
     * 多个字符串求和
     *
     * @param num
     * @return
     */
    public static BigDecimal getAddBigDecimal(Object... num) {
        BigDecimal res = new BigDecimal("0");
        if (ObjUtil.isNull(num)) {
            return res;
        }
        for (Object s : num) {
            res = res.add(TeamUtils.getBigDecimal(String.valueOf(s)));
        }
        return res;
    }

    /**
     * 位数补0
     *
     * @param str
     * @param length
     * @return
     */
    public static String fillZeroBeforeString(String str, int length) {
        return fillStringBeforeString(str, "0", length);
    }

    public static String fillStringBeforeString(String str, String fill, int length) {
        if (str.length() < length) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < length - str.length(); i++) {
                sb.append(fill);
            }
            sb.append(str);
            return sb.toString();
        } else {
            return str;
        }
    }

    /**
     * 通过周期编码 -> 周期类型（1：月度 2：季度 3：年度）
     *
     * @param periodCode
     * @return
     */
    public static String getPeriodTypeByCode(String periodCode) {
        if (StrUtil.isBlank(periodCode)) {
            return "-1";
        }
        if (periodCode.length() == 4) {
            // 年度
            return "3";
        } else if (periodCode.length() == 6 && periodCode.indexOf("Q") == -1) {
            // 月度
            return "1";
        } else if (periodCode.length() == 6 && periodCode.indexOf("Q") != -1) {
            // 季度
            return "2";
        }
        return "-1";
    }
}
